From e2edfe6c73a287989911630a070c3e6c1137446f Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 17 Jan 2008 14:41:12 +0000 Subject: [PATCH] minios: add wait_event_deadline Signed-off-by: Samuel Thibault Signed-off-by: Tim Deegan --- extras/mini-os/include/wait.h | 44 ++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/extras/mini-os/include/wait.h b/extras/mini-os/include/wait.h index 6bd4d0ce95..cbcaab3519 100644 --- a/extras/mini-os/include/wait.h +++ b/extras/mini-os/include/wait.h @@ -85,29 +85,31 @@ static inline void wake_up(struct wait_queue_head *head) local_irq_restore(flags); \ } while (0) -#define wait_event(wq, condition) do{ \ - unsigned long flags; \ - if(condition) \ - break; \ - DEFINE_WAIT(__wait); \ - for(;;) \ - { \ - /* protect the list */ \ - local_irq_save(flags); \ - add_wait_queue(&wq, &__wait); \ - block(current); \ - local_irq_restore(flags); \ - if(condition) \ - break; \ - schedule(); \ - } \ - local_irq_save(flags); \ - /* need to wake up */ \ - wake(current); \ - remove_wait_queue(&__wait); \ - local_irq_restore(flags); \ +#define wait_event_deadline(wq, condition, deadline) do { \ + unsigned long flags; \ + if(condition) \ + break; \ + DEFINE_WAIT(__wait); \ + for(;;) \ + { \ + /* protect the list */ \ + local_irq_save(flags); \ + add_wait_queue(&wq, &__wait); \ + current->wakeup_time = deadline; \ + clear_runnable(current); \ + local_irq_restore(flags); \ + if((condition) || (deadline && NOW() >= deadline)) \ + break; \ + schedule(); \ + } \ + local_irq_save(flags); \ + /* need to wake up */ \ + wake(current); \ + remove_wait_queue(&__wait); \ + local_irq_restore(flags); \ } while(0) +#define wait_event(wq, condition) wait_event_deadline(wq, condition, 0) -- 2.30.2